View Javadoc

1   /*
2    * Copyright 2003,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.geronimo.ews.ws4j2ee.toWs.dd;
17  
18  import org.apache.axis.encoding.SerializationContext;
19  import org.apache.axis.wsdl.fromJava.Emitter;
20  import org.apache.geronimo.ews.ws4j2ee.context.J2EEWebServiceContext;
21  import org.apache.geronimo.ews.ws4j2ee.toWs.GenerationFault;
22  import org.apache.geronimo.ews.ws4j2ee.toWs.UnrecoverableGenerationFault;
23  import org.apache.geronimo.ews.ws4j2ee.toWs.Writer;
24  import org.apache.geronimo.ews.ws4j2ee.utils.Utils;
25  
26  import javax.wsdl.Binding;
27  import javax.wsdl.Operation;
28  import javax.wsdl.Part;
29  import javax.wsdl.Port;
30  import javax.wsdl.Service;
31  import javax.xml.namespace.QName;
32  import java.io.IOException;
33  import java.lang.reflect.Method;
34  import java.util.HashMap;
35  import java.util.Iterator;
36  import java.util.Map;
37  
38  /***
39   * @author Srinath Perera(hemapani@opensource.lk)
40   */
41  public class JaxRpcMappingFileWriter implements Writer {
42      private SerializationContext sc;
43      private String ns = "http://java.sun.com/xml/ns/j2ee";
44      private Emitter emitter;
45      private J2EEWebServiceContext j2eewscontext;
46  
47      public JaxRpcMappingFileWriter(java.io.Writer out,
48                                     Emitter emitter,
49                                     J2EEWebServiceContext j2eewscontext) {
50          if (out == null) {
51              throw new UnrecoverableGenerationFault(out + " The writer is null");
52          }
53          sc = new SerializationContext(out);
54          sc.setPretty(true);
55          this.emitter = emitter;
56          this.j2eewscontext = j2eewscontext;
57      }
58  
59      private void writePackageMapping() throws IOException {
60          String jaxrpcsei = j2eewscontext.getMiscInfo().getJaxrpcSEI();
61          Map map = emitter.getNamespaceMap();
62          String val = null;
63          if (map != null) {
64              Iterator packages = map.keySet().iterator();
65              while (packages.hasNext()) {
66                  String pkg = (String) packages.next();
67                  if (pkg == null) {
68                      //TODO this is temporrary work around to make sure 
69                      //the mapping is defined.
70                      String pkgName = Utils.getPackageNameFromQuallifiedName(jaxrpcsei);
71                      val = (String) map.get(pkgName);
72                      if (val == null) {
73                          val = Utils.javapkgToURI(pkgName);
74                      } else {
75                          continue;
76                      }
77                  } else if (pkg.equals(jaxrpcsei)) {
78                      continue;
79                  } else {
80                      val = (String) map.get(pkg);
81                  }
82                  //TODO FIX this code to simplfy. 
83                  if (pkg != null) {
84                      sc.startElement(new QName(ns, "package-mapping"), null);//package-mapping
85                      sc.startElement(new QName(ns, "package-type"), null);
86                      sc.writeString(pkg);
87                      sc.endElement();
88                      sc.startElement(new QName(ns, "namespaceURI"), null);
89                      sc.writeString(val);
90                      sc.endElement();
91                      sc.endElement();//package-mapping                            
92                  }
93              }
94          }
95      }
96  
97      public void writeServiceMapping() throws IOException {
98          Service service = j2eewscontext.getWSDLContext().gettargetService().getService();
99          sc.startElement(new QName(ns, "service-interface-mapping"), null);//service-interface-mapping   
100         String name = emitter.getCls().getName();
101         int index = name.lastIndexOf('.');
102         String packageName = "";
103         if (index > 0)
104             packageName = name.substring(0, index + 1);
105         sc.startElement(new QName(ns, "service-interface"), null);
106         sc.writeString(packageName + emitter.getServiceElementName());
107         sc.endElement();
108         sc.registerPrefixForURI("ns1", service.getQName().getNamespaceURI());
109         sc.startElement(new QName(ns, "wsdl-service-name"), null);
110         sc.writeString("ns1:" + service.getQName().getLocalPart());
111         sc.endElement();
112             
113         //port mapping
114         Port wsdlport = j2eewscontext.getWSDLContext().getTargetPort();
115         sc.startElement(new QName(ns, "port-mapping"), null);//port-mapping
116         sc.startElement(new QName(ns, "port-name"), null);
117         sc.writeString(wsdlport.getName());
118         sc.endElement();
119         sc.startElement(new QName(ns, "java-port-name"), null);
120         sc.writeString(emitter.getServicePortName());
121         sc.endElement();
122         sc.endElement();//port-mapping
123         sc.endElement();//service-interface-mapping       
124     }
125 
126     private void writeReturnTypes(HashMap methods, Operation op) throws IOException {
127         //set return type
128         Method mtd = (Method) methods.get(op.getName());
129         Class ret = mtd.getReturnType();
130         if (ret != null && !("void".equals(ret.toString()))) {
131             //set return type info
132             Map parts = op.getOutput().getMessage().getParts();
133             if (parts != null) {
134                 Iterator partIt = parts.values().iterator();
135                 while (partIt.hasNext()) {
136                     //set wsdl message type
137                     QName messagename = op.getOutput().getMessage().getQName();
138                         
139                     //set wsdl message part type
140                     sc.startElement(new QName(ns, "wsdl-return-value-mapping"), null);
141                     sc.startElement(new QName(ns, "method-return-value"), null);
142                     sc.writeString(ret.getName());
143                     sc.endElement();
144                     sc.registerPrefixForURI("ns1", messagename.getNamespaceURI());
145                     sc.startElement(new QName(ns, "wsdl-message"), null);
146                     sc.writeString("ns1:" + messagename.getLocalPart());
147                     sc.endElement();
148                     sc.startElement(new QName(ns, "wsdl-message-part-name"), null);
149                     sc.writeString(((Part) partIt.next()).getName());
150                     sc.endElement();
151                     sc.endElement();//wsdl-return-value-mapping
152                 }
153             }
154         }
155     }
156 
157     private void writeParametParts(HashMap methods, Operation op) throws IOException {
158         int position = 0;
159         Class[] params = ((Method) methods.get(op.getName())).getParameterTypes();
160         Iterator parmIt = null;
161         Map parameters = op.getInput().getMessage().getParts();
162         if (parameters != null) {
163             parmIt = parameters.values().iterator();
164         }
165         while (parmIt != null && parmIt.hasNext()) {
166             Part part = (Part) parmIt.next();
167             sc.startElement(new QName(ns, "method-param-parts-mapping"), null);
168 
169             //set parameter position
170             sc.startElement(new QName(ns, "param-position"), null);
171             sc.writeString(Integer.toString(position));
172             sc.endElement();
173             //set parameter java typr
174             sc.startElement(new QName(ns, "param-type"), null);
175             sc.writeString(params[position].getName());
176             sc.endElement();
177                 
178             //set message mapping
179             sc.startElement(new QName(ns, "wsdl-message-mapping"), null);
180             QName messagename = op.getInput().getMessage().getQName();
181             sc.registerPrefixForURI("ns1", messagename.getNamespaceURI());
182             sc.startElement(new QName(ns, "wsdl-message"), null);
183             sc.writeString(messagename.getLocalPart());
184             sc.endElement();
185             sc.startElement(new QName(ns, "wsdl-message-part-name"), null);
186             sc.writeString(part.getName());
187             sc.endElement();
188             sc.startElement(new QName(ns, "parameter-mode"), null);
189             sc.writeString("IN");
190             sc.endElement();
191             sc.endElement();//wsdl-message-mapping
192             sc.endElement();//method-param-parts-mapping
193         }
194     }
195 
196     private void writeMethodMapping(Binding binding) throws IOException {
197         //add the operation mappings
198         Iterator ops = binding.getPortType().getOperations().iterator();
199         while (ops.hasNext()) {
200             Operation op = (Operation) ops.next();
201             sc.startElement(new QName(ns, "service-endpoint-method-mapping"), null);//service-endpoint-method-mapping
202 
203             //set the java method name
204             sc.startElement(new QName(ns, "java-method-name"), null);
205             sc.writeString(op.getName());
206             sc.endElement();
207             sc.startElement(new QName(ns, "wsdl-operation"), null);
208             sc.writeString(op.getName());
209             sc.endElement();
210             HashMap methods = new HashMap();
211             Method[] javamethods = emitter.getCls().getMethods();
212             for (int i = 0; i < javamethods.length; i++) {
213                 methods.put(javamethods[i].getName(), javamethods[i]);
214             }
215             writeReturnTypes(methods, op);
216             //create method param parts mappings    
217             sc.endElement();//service-endpoint-method-mapping
218         }
219     }
220 
221     public void write() throws GenerationFault {
222         try {
223             sc.startElement(new QName(ns, "java-wsdl-mapping"), null);
224             writePackageMapping();
225             writeServiceMapping();
226             //port mapping
227             Port wsdlport = j2eewscontext.getWSDLContext().getTargetPort();
228             Binding binding = wsdlport.getBinding();
229             if (binding == null)
230                 throw new UnrecoverableGenerationFault("no port discription not match with the wsdl file");
231             sc.startElement(new QName(ns, "service-endpoint-interface-mapping"), null);
232             sc.startElement(new QName(ns, "service-endpoint-interface"), null);
233             sc.writeString(emitter.getCls().getName());
234             sc.endElement();
235             sc.registerPrefixForURI("ns2", binding.getQName().getNamespaceURI());
236             sc.startElement(new QName(ns, "wsdl-binding"), null);
237             sc.writeString("ns2:" + binding.getQName().getLocalPart());
238             sc.endElement();
239             QName ptName = binding.getPortType().getQName();
240             sc.registerPrefixForURI("ns3", ptName.getNamespaceURI());
241             sc.startElement(new QName(ns, "wsdl-port-type"), null);
242             sc.writeString("ns3:" + ptName.getLocalPart());
243             sc.endElement();
244             writeMethodMapping(binding);
245             sc.endElement(); //service-endpoint-interface-mapping   
246             sc.endElement();//java-wsdl-mapping
247         } catch (IOException e) {
248             // TODO Auto-generated catch block
249             e.printStackTrace();
250         }
251     }
252 
253 }